import sys

import pandas as pd
import os
from typing import Union, Dict, Any, List, Optional
from pymongo import MongoClient
import sys
import os


# 将项目根目录添加到 sys.path
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from nebula_data_engine.df_data_engine import DFDataEngine
from nebula_data_engine.file_data_engine import FileDataEngine
from nebula_data_engine.mongo_data_engine import MongoDataEngine
import pandas as pd
import os
from typing import Union, Dict, Any, List, Optional
from pymongo import MongoClient
import pandas as pd
import os
from typing import Union, Dict, Any, List, Optional
from pymongo import MongoClient
import pandas as pd
import os
from typing import Union, Dict, Any, List, Optional
from pymongo import MongoClient

class NebulaDataEngine:
    def __new__(
        cls,
        data: Union[pd.DataFrame, Dict[str, pd.DataFrame], List[Dict[str, Any]], str],
        table_name: Optional[str] = None,
        return_format: str = "json",
        auto_create_table: bool = True,
        auto_add_id: bool = True,
    ):
        """
        工厂方法，根据数据源类型返回合适的引擎类实例。
        :param data: 数据源，可以是字典、DataFrame、列表或文件路径/数据库连接字符串。
        :param table_name: 默认表名。
        :param return_format: 返回格式（json 或 DataFrame）。
        :param auto_create_table: 是否自动创建表。
        :param auto_add_id: 是否自动添加 ID 列。
        """
        if isinstance(data, str):
            if cls._is_mongo_connection(data):
                # 返回 MongoDataEngine 实例
                return MongoDataEngine(data, table_name, return_format, auto_create_table)
            elif cls._is_file_path(data):
                # 返回 FileDataEngine 实例
                return FileDataEngine(data, table_name, return_format, auto_create_table, auto_add_id)
            else:
                raise ValueError("无法识别的数据源类型。请检查传入的连接字符串。")
        elif isinstance(data, (pd.DataFrame, dict, list)):
            # 返回 DFDataEngine 实例
            return DFDataEngine(data, table_name, return_format, auto_create_table, auto_add_id)
        else:
            raise ValueError("不支持的数据类型。请提供 DataFrame、字典、列表或数据源连接字符串。")

    @staticmethod
    def _is_mongo_connection(conn_str: str) -> bool:
        """检查是否是 MongoDB 连接字符串"""
        return conn_str.startswith("mongodb://")

    @staticmethod
    def _is_file_path(path: str) -> bool:
        """检查是否是文件路径"""
        return os.path.exists(path) or path.endswith((".csv", ".json", ".xls", ".xlsx", ".db"))

    def save(self, entity: Dict[str, Any], table_name: Optional[str] = None) -> str:
        """插入数据（空方法，由子类实现）"""
        raise NotImplementedError("save 方法需要由子类实现")

    def delete(self, query: Dict[str, Any], table_name: Optional[str] = None) -> int:
        """删除数据（空方法，由子类实现）"""
        raise NotImplementedError("delete 方法需要由子类实现")

    def deleteById(self, id: str, table_name: Optional[str] = None) -> int:
        """根据 ID 删除数据（空方法，由子类实现）"""
        raise NotImplementedError("deleteById 方法需要由子类实现")

    def update(self, query: Dict[str, Any], update_data: Dict[str, Any], table_name: Optional[str] = None) -> int:
        """更新数据（空方法，由子类实现）"""
        raise NotImplementedError("update 方法需要由子类实现")

    def updateById(self, id: str, update_data: Dict[str, Any], table_name: Optional[str] = None) -> int:
        """根据 ID 更新数据（空方法，由子类实现）"""
        raise NotImplementedError("updateById 方法需要由子类实现")

    def find(self, query: Dict[str, Any], table_name: Optional[str] = None) -> Union[List[Dict], pd.DataFrame]:
        """查询数据（空方法，由子类实现）"""
        raise NotImplementedError("find 方法需要由子类实现")

    def findAll(self, table_name: Optional[str] = None) -> Union[List[Dict], pd.DataFrame]:
        """查询所有数据（空方法，由子类实现）"""
        raise NotImplementedError("findAll 方法需要由子类实现")

    def findById(self, id: str, table_name: Optional[str] = None) -> Union[Dict, pd.DataFrame]:
        """根据 ID 查询数据（空方法，由子类实现）"""
        raise NotImplementedError("findById 方法需要由子类实现")

    def findPage(self, query: Dict[str, Any], page: int, page_size: int, table_name: Optional[str] = None) -> Union[List[Dict], pd.DataFrame]:
        """分页查询数据（空方法，由子类实现）"""
        raise NotImplementedError("findPage 方法需要由子类实现")



